// 函数练习、函数的嵌套调用和链式访问、如何不暴露.c源文件同时分享函数的使用

#include<stdio.h>
// #include<string.h> // 调用strcpy ()函数使用
//---------------------------------------------小节分割线--------------------------------------------
//练习1：判断一个年份是否是闰年
// 如果函数前面不写返回类型，则默认返回int类型
// int is_leap_year(int year)
// {   
//     if ((year % 400 ==0) || (year % 4 ==0 && year % 100 !=0)){
//         return 1;
//     }
//     else{
//         return 0;
//     }
// }
// int main()
// {
//     int year = 2000;
//     int flag = 0; // 判断是否是闰年，是为1，不是为0
//     flag = is_leap_year(year);
//     if (flag == 1)
//     {
//         printf("%d 是闰年\n",year);
//     }
//     else
//     {
//         printf("%d 不是闰年\n",year);
//     }
//     return 0;
// }
//---------------小分割线 >.< --------------------
//练习2：实现一个整形有序数组的二分查找。
// 数组的传参，仅仅是传递了首元素的地址
// 如果某个数组内需要数组的个数，那就要在调用之前先求出来，一起传进去
// 否则会出现在函数内部求不出大小的问题
// int binary_search(int arr[], int key, int sz) // 这里的int arr[]其实只是首元素的地址，相当于int* arr
// {
//     int left = 0; // 查找过程中的左侧指针
//     int right = sz - 1; // 下标从0开始，所以要减一
//     while (left <= right)
//     {
//         int mid = (left + right)/2; // 查找中使用的下标
//         if (arr[mid] < key)
//         {
//             left = mid + 1;
//         }
//         else if (arr[mid] > key)
//         {
//             right = mid - 1;
//         }
//         else
//         {
//             return mid;
//         }
//     }
//     return -1;
// }

// int main()
// {
//     int arr[] = {1,2,3,4,5,6,7,8,9,10};
//     int key = 17;
//     int sz = sizeof(arr)/sizeof(arr[0]); // arr数组的元素个数
//     // 找到就返回位置的下标，找不到就返回-1
//     int ret = binary_search(arr, key, sz);
//     if (ret == -1)
//     {
//         printf("找不到");
//     }
//     else
//     {
//         printf("找到了，下标为%d\n", ret);
//     }
//     return 0;
// }
//---------------小分割线 >.< --------------------
//练习3： 使用传地址调用写一个函数，每调用一次这个函数，就会将 num 的值增加1。
// void Add(int* p)
// {
//     (*p)++;
//     return 0;
// }
// int main()
// {
//     int num = 0;
//     Add(&num);
//     printf("%d\n",num);
//     Add(&num);
//     printf("%d\n",num);
//     Add(&num);
//     printf("%d\n",num);
//     return 0;
// }
//---------------------------------------------小节分割线--------------------------------------------
// 函数的声明
// 函数声明一般放在头文件中
int Add(int, int); //声明一下有这个函数，避免定义在后面调用时没有定义过

int main()
{
    int x = 10;
    int y = 20;
    printf("%d\n", Add(x, y));
    return 0;
}

int Add(int x, int y)
{
    return x+y;
}
//---------------------------------------------小节分割线--------------------------------------------
// 头文件.h后缀，源代码.c文件，在头文件中里面对源代码进行声明与解释如何使用
// 编译了源代码后可以生成一个静态库文件.lib
// 只给对方提供.h和.lib，代码一样可以运行，但是看不到.c文件中如何实现
// 具体见P50的31:45
//https://www.bilibili.com/video/BV1cq4y1U7sg?p=50&vd_source=40c20082c61d87d7db0343143fc99fc8